



#ifndef _COLOR_H_
#define _COLOR_H_

#include "gl_GraphicsDevice.h"



#define RGB888_RED      0x00ff0000    // 1111 1111 0000 0000 0000 0000 
#define RGB888_GREEN    0x0000ff00    // 0000 0000 1111 1111 0000 0000 
#define RGB888_BLUE     0x000000ff    // 0000 0000 0000 0000 1111 1111 
#define RGB565_RED      0xf800		  // 1111 1    000 000   0 0000 | 0000 0000 1111 1000      // 1111 1000 = F8
#define RGB565_GREEN    0x07e0		  // 0000 0    111 111   0 0000 | 0000 0000 1111 1100      // 1111 1100 = FC
#define RGB565_BLUE     0x001f 		  // 0000 0    000 000   1 1111 | 0000 0000 1111 1000


/// <summary>
/// rgb 888 转换成 rgb 565
/// </summary>
/// <param name="n888Color">rgb 888</param>
/// <returns>rgb 565</returns>
RGB565 RGB888ToRGB565(const RGB888 n888Color);

/// <summary>
/// rgb 565 转换成 rgb 888
/// </summary>
/// <param name="n565Color">rgb 565</param>
/// <returns>rgb 888</returns>
RGB888 RGB565ToRGB888(const RGB565 n565Color);



/// <summary>
/// 三原色结构体，所有分量都已经归一化。R红，G绿，B蓝。
/// </summary>
typedef struct {
    float R;//红色分量
    float G;//绿色分量
    float B;//蓝色分量
} RGBType;

/// <summary>
/// HSV的结构体。所有分量都已经归一化，取值在0-1。 
/// HSV的定义比较简单易于计算，不需要三角函数。 HSI的计算则需要三角函数，比较麻烦。两者的数学定义不同，但视觉上差不多。
/// 色调H（Hue）：色调H用角度度量，取值范围为0°～360°。这里归一化至0-1。
/// 从红色开始按逆时针方向计算，红色为0°，绿色为120°，蓝色为240°。
/// 设 max 等价于 r, g ,b 中的最大者。设 min 等于这些值中的最小者.
/// if(max==r) H = 60°*(g-b)/(max-min).  (这时在色相环红色区域，H在0±60°。负数要加360°补齐)
/// if(max==g) H = 60°*(b-r)/(max-min) + 120.(这时在色相环绿色区域，H在120±60°。用蓝色和红色分量的差值确定角度)
/// if(max==b) H = 60°*(r-g)/(max-min) + 240.(这时在色相环蓝色区域，H在240±60°。用红色和绿色分量的差值确定角度)
/// 饱和度S（Saturation）= 1- min/max .如果max=0,S = 0.饱和度越大，颜色看起来就会越鲜艳，反之亦然。
/// 亮度I（Intensity）= max：表示颜色的明亮程度。这里的亮度不是灰度了。
/// </summary>
typedef struct {
    float H;//色相，表示在色相环上的位置。
    float S;//饱和度。表示颜色的纯度，当S=1时，表示颜色最纯
    float V;//亮度，当V=1，颜色最亮，当V=0时，亮度最低，此时表示颜色为黑色。
} HSVType;


/// <summary>
/// 颜色模型转换
/// </summary>
/// <param name="RGB">RGB形式颜色</param>
/// <param name="HSV">HSV形式颜色</param>
void RGB_to_HSV(RGBType* RGB, HSVType* HSV);

/// <summary>
/// 颜色模型转换
/// </summary>
/// <param name="HSV">HSV形式颜色</param>
/// <param name="RGB">RGB形式颜色</param>
void HSV_to_RGB(HSVType* HSV, RGBType* RGB);

/// <summary>
/// 颜色模型转换
/// </summary>
/// <param name="RGB">RGB形式颜色</param>
COLOR_RGB RGB_to_COLOR(RGBType* RGB);

/// <summary>
/// 颜色模型转换
/// </summary>
/// <param name="HSV">HSV形式颜色</param>
COLOR_RGB HSV_to_COLOR(HSVType* HSV);


#define COLOR_888_TO_565(n888Color)  (RGB565)( ((n888Color & 0X000000F8 ) >> 3) | ((n888Color & 0X0000FC00) >> 5) | ((n888Color & 0X00FC0000) >> 8) )

/*
   RGB565 n565Color = 0;
    // 获取RGB单色，并截取高位
    unsigned char cRed = (n888Color & RGB888_RED) >> 19;
    unsigned char cGreen = (n888Color & RGB888_GREEN) >> 10;
    unsigned char cBlue = (n888Color & RGB888_BLUE) >> 3;
    // 连接
    n565Color = (cRed << 11) + (cGreen << 5) + (cBlue << 0);
    return n565Color;
    */


#if (COLOR_rgb565 == 1)

#define	RGB_red				0xf800
#define	RGB_green			0x07e0
#define	RGB_blue		    0x001f
#define	RGB_white			0xFFFF
#define	RGB_black			0x0000

#define	RGB_lightred	    COLOR_888_TO_565(0xFF5555)
#define	RGB_lightgreen		COLOR_888_TO_565(0x55FF55)
#define	RGB_lightblue		COLOR_888_TO_565(0x5555FF)
#define	RGB_cyan		    COLOR_888_TO_565(0x00AAAA)  //cyan  蓝绿色，青色
#define	RGB_lightcyan		COLOR_888_TO_565(0x55FFFF)
#define	RGB_magenta			COLOR_888_TO_565(0xAA00AA) //magenta洋红，品红，紫红
#define	RGB_lightmagenta  	COLOR_888_TO_565(0xFF55FF)
#define	RGB_yellow			COLOR_888_TO_565(0xFFFF55)
#define	RGB_brown			COLOR_888_TO_565(0xAA5500) //棕色

#define	RGB_darkgray	    COLOR_888_TO_565(0x505050) //深灰
#define	RGB_lightgray		COLOR_888_TO_565(0xA0A0A0) //浅灰


#define RGB_window_blue   COLOR_888_TO_565(0xD5E7F4)
#define RGB_window_green  COLOR_888_TO_565(0x93C2A8)
#define RGB_window_gray   COLOR_888_TO_565(0x848484)   //窗口背景色风格。

#define RGB_crtl_blue   COLOR_888_TO_565(0x84DFF3)
#define RGB_ctrl_green  COLOR_888_TO_565(0x84F3CD)
#define RGB_ctrl_purple COLOR_888_TO_565(0xCAC0FA)  //控件默认颜色样式

#define RGB_line_blue   COLOR_888_TO_565(0x0172FD)   //控件默认边框颜色。线框宽度是2即可。
#define RGB_line_yellow COLOR_888_TO_565(0xFBFF00)  //控件选中是的边框颜色


#else  
#define	RGB_red				0xAA0000
#define	RGB_green			0x00AA00
#define	RGB_blue		    0x0000AA
#define	RGB_white			0xFFFFFF
#define	RGB_black			0x000000


#define	RGB_lightred	    0xFF5555
#define	RGB_lightgreen		0x55FF55
#define	RGB_lightblue		0x5555FF
#define	RGB_cyan		    0x00AAAA  //cyan  蓝绿色，青色
#define	RGB_lightcyan		0x55FFFF
#define	RGB_magenta			0xAA00AA  //magenta洋红，品红，紫红
#define	RGB_lightmagenta  	0xFF55FF
#define	RGB_yellow			0xFFFF55
#define	RGB_brown			0xAA5500  //棕色
#define	RGB_darkgray	    0x555555  //深灰
#define	RGB_lightgray		0xAAAAAA  //浅灰

#define RGB_window_blue   0xD5E7F4
#define RGB_window_green  0x93C2A8
#define RGB_window_gray   0x848484   //窗口背景色风格。

#define RGB_crtl_blue  0x84DFF3
#define RGB_ctrl_green  0x84F3CD
#define RGB_ctrl_purple  0xCAC0FA  //控件默认颜色样式

#define RGB_line_blue  0x0172FD    //控件默认边框颜色。线框宽度是2即可。
#define RGB_line_yellow  0xFBFF00  //控件选中是的边框颜色

#endif


//下面全是RDB格式颜色。快捷键：down->home跳到下一行行首

//#define RGB_BabyBlue   0xe5f1fb    //淡蓝
//#define RGB_DeepBlue   0xcce4f7   //深蓝
//#define RGB_LightGray1	0xe1e1e1  //浅灰






#endif





